/*
 * @Author: wangjing wangjin122@qq.com
 * @Date: 2024-02-22 17:21:39
 * @LastEditors: wangjing wangjin122@qq.com
 * @LastEditTime: 2024-02-23 15:07:57
 * @FilePath: \生成器和迭代器\index.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

// 1. 生成器
function* gen() {
  yield Promise.resolve('111')
  yield '222'
  yield '333'
  yield '444'
}
const man = gen()
// console.log(man.next()) // {value: Promise {'111'}, done: false}
// console.log(man.next()) // {value: 222, done: false}
// console.log(man.next()) // {value: 333, done: false}
// console.log(man.next()) // {value: 444, done: false}
// console.log(man.next()) // {value: undefined, done: true}

// 2. set map 
let set: Set<number> = new Set([1,1,2,2,3,3]) // 天然去重 1,2,3
// console.log(set) // Set(3) {1,2,3}

let map = new Map()
let Arr = [1,2,3]
map.set(Arr, '娃哈哈')
// console.log(map.get(Arr)) // 娃哈哈

function args() {
  // console.log(arguments) // 伪数组
}

// 3. 迭代器 支持数据和伪数组的遍历
// const each = (value: any) => {
//   let It: any = value[Symbol.iterator]()
//   let next: any = { done: false }
//   while (!next.done) {
//     next = It.next()
//     if(!next.done) {
//       console.log(next.value)
//     }
//   }
// }
// each(map)

/**
 * 4. 迭代器语法糖 for of
 *  for of 和 数组解构 底层用的就是迭代器[Symbol.iterator]()方法
 *  对象不能用 因为对象没有[Symbol.iterator]()方法
*/
for(let value of set) {
  console.log(value)
}
// console.log(...set)
// console.log(...map)
// console.log([...Arr])

/**
 * 5. 解构 底层原理也是去调用iterator
*/
// 利用底层原理使对象也支持for of
// let obj = {
//   max: 5,
//   current: 0,
//   [Symbol.iterator]() {
//     return {
//       max: this.max,
//       current: this.current,
//       next() {
//         if(this.current == this.max) {
//           return {
//             value: undefined,
//             done: true
//           }
//         } else {
//           return {
//             value: this.current++,
//             done: false
//           }
//         }
//       }
//     }
//   }
// }
// for(let value of obj) {
//   console.log(value)
// }
// console.log([...obj])
